{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 01-lab-线性回归和温度转换探究教案\n",
    "\n",
    "## 1.引言\n",
    "\n",
    "在科学研究和实际应用中，我们经常需要根据已知数据预测未知数据。线性回归是一种简单但强大的统计方法，可以用于预测连续变量之间的关系。本实验用“线性回归”算法验证摄氏温度与华氏温度的线性关系，掌握使用BaseML库训练一个线性回归模型。\n",
    "\n",
    "## 2.实验目的\n",
    "\n",
    "  - 通过自主探究，理解线性关系的特征并且知道可以使用线性回归算法来转换温度；\n",
    "  - 通过使用BaseML的线性回归算法搭建模型，训练温度转换模型，掌握线性回归算法；\n",
    "  - 通过对模型的进一步验证，能够解释如何对模型进行评估并清晰描述R平方值的含义;\n",
    "  - 通过对数据集的处理，能够理解输入数据与输出数据的含义。\n",
    "\n",
    "## 3.实验指导\n",
    "### 3.1 线性回归算法介绍\n",
    "\n",
    "回归是一种机器学习方法，简单来说，它的作用是预测数值。比如，我们想通过知道的房子面积、房间数量等信息，来猜测这个房子的价格。这种预测价格的任务，就是一个回归任务。\n",
    "在回归任务中，有一种叫做线性回归的方法。这个方法就像是使用一条直线来帮助我们预测。比如，如果我们知道很多房子的面积和它们的价格，这些数值可以构成一个散点图。线性回归的任务就是找到一条直线，这条直线尽可能地接近所有这些数据点，通过房子的面积来告诉我们大概的价格。这样，我们就可以用这个方法来预测其他房子的价格。以此类推，我们还可以预测商品的销售额、银行贷款的额度等。\n",
    "线性方程是数学中的一种方程，它描述了两个或多个变量之间的线性关系。在最简单的形式中，线性方程可以表示为：𝑎𝑥+𝑏=0。这里：a 是一个非零常数，称为方程的系数；x 是一个变量；b 是另一个常数。\n",
    "\n",
    "![线性方程](../image/01-lab-001.png)\n",
    "\n",
    "感兴趣的同学可以点击链接查看更详细的线性回归算法介绍：\n",
    "\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn-linear-model-linearregression\n",
    "\n",
    "### 3.2 训练线性回归模型的程序实现\n",
    "\n",
    "BaseML库提供了众多机器学习训练方法，如线性回归、KNN、SVM等等，可以快速训练和应用模型。接下来以线性回归算法为例，进行基本语法说明。\n",
    "\n",
    "1. 基础代码示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Setting fit_intercept to True\n",
      "Setting positive to False\n",
      "Saving model checkpoints...\n",
      "Saved successfully!\n",
      "验证r2-score为：100.0%\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x550 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 导入基础库/导入BaseML库中的Regression（回归分析）模块，并将其别名设置为reg\n",
    "from BaseML import Regression as reg\n",
    "# 实例化模型/创建一个线性回归模型的实例\n",
    "model = reg(algorithm = 'LinearRegression')\n",
    "# 指定某个数据集/data.csv是一个表格格式的文件，包含用于训练的数据\n",
    "model.set_para(fit_intercept=True, positive=False)\n",
    "model.load_tab_data('./data/model_train.csv')\n",
    "# 模型训练\n",
    "model.train()\n",
    "# 模型保存至指定路径，保存的文件名为linearegression_data.pkl，用于之后加载和使用模型\n",
    "model.save('checkpoints/linearegression_data.pkl')\n",
    "\n",
    "# 载入已保存的模型 \n",
    "model.load('checkpoints/linearegression_data.pkl')\n",
    "# 模型评估/这里使用R的平方值（𝑅2）作为评价指标，它衡量模型对数据的拟合程度。data.csv是包含测试数据的文件\n",
    "r2,result = model.valid('./data/model_evaluation.csv', metrics='r2')\n",
    "# 评价指标可视化\n",
    "model.metricplot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对回归任务来说，简单好用的评估指标之一是R平方值。R平方值的范围在0和1之间。预测结果完全准确时R平方值为1，数值越接近1表示误差越小，反之表示误差大。当R平方值为0时，意味着模型与实际数据之间没有相关性。\n",
    ".pkl文件格式可以理解为将python中的数组、列表等持久化地存储在硬盘上的一种方式。\n",
    "\n",
    "2. 模型参数设置\n",
    "\n",
    "线性回归算法的参数及其默认值包括fit_intercept=True, positive=False。fit_intercept决定了是否需要计算截距（即线性模型的常数项b）。\n",
    "\n",
    "```\n",
    "model.set_para(fit_intercept=True, positive=False)\n",
    "```\n",
    "\n",
    "如果设置为True，则线性回归模型会计算一个截距，即y轴上的截距，这样模型可以表示为y = mx + b，其中m是斜率，b是截距。如果设置为False，则模型不会计算截距，方程简化为通过原点的形式y = mx；positive用于限制线性回归模型中系数（斜率）的正负，默认值为False。默认情况下，线性回归模型不限制系数的正负，允许模型根据数据自由地选择最佳的系数，无论它们是正是负。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.实验资源和步骤\n",
    "### 4.1 实验资源\n",
    "\n",
    "实验工具\n",
    "- BaseML库\n",
    "\n",
    "实验数据集\n",
    "\n",
    "实验一对应的数据集(输入数据为摄氏温度，输出数据为华氏温度。该数据集用于训练模型。)\n",
    "- data/model_train.csv(训练数据集)\n",
    "- data/model_evaluation.csv(验证数据集)\n",
    "\n",
    "实验二对应的数据集(输入数据为摄氏温度，输出数据为华氏温度。该数据集用于训练模型，建议学生可以自行收集和验证。)\n",
    "- data/model_train_2.csv(训练数据集)\n",
    "- data/model_evaluation_2.csv(验证数据集)\n",
    "\n",
    "实验拓展所用数据集。输入数据为摄氏温度，输出数据为华氏温度。该数据集用于基于Excel的散点图绘制与趋势线分析。\n",
    "- data/Celsius to Fahrenheit.xlsx\n",
    "\n",
    "### 4.2 实验步骤\n",
    "\n",
    "### 4.2.1 实验一：输入摄氏温度输出华氏温度\n",
    "\n",
    "通过观察摄氏温度和华氏温度对应表，我们知道这二者之间存在一定的对应关系。假设我们并不清楚它们之间的转换公式，能否通过训练线性回归模型来找出二者之间关系？请以小组为单位，参考资源包中的代码完成模型训练，实现功能：“输入摄氏温度输出华氏温度”。主要实践内容包括：\n",
    "\n",
    "1. 步骤1：数据准备\n",
    "\n",
    "实验一需要用到的数据集有model_train.csv和model_evaluation.csv。\n",
    "\n",
    "2. 步骤2：加载模型\n",
    "\n",
    "首先我们需要导入必要的库文件并构建线性回归模型。LinearRegression用于线性回归，它可以帮助我们建立和分析线性模型，从而预测变量之间的关系。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: BaseML in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (0.1.5)\n",
      "Requirement already satisfied: scikit-learn in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (1.3.2)\n",
      "Requirement already satisfied: pandas in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (2.0.3)\n",
      "Requirement already satisfied: numpy in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (1.24.3)\n",
      "Requirement already satisfied: seaborn in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (0.13.2)\n",
      "Requirement already satisfied: scikit-image in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (0.21.0)\n",
      "Requirement already satisfied: matplotlib in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (3.7.2)\n",
      "Requirement already satisfied: opencv-python>=4.1.2.30 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (4.10.0.84)\n",
      "Requirement already satisfied: yellowbrick in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (1.5)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (1.0.5)\n",
      "Requirement already satisfied: cycler>=0.10 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (0.11.0)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (4.51.0)\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (1.4.4)\n",
      "Requirement already satisfied: packaging>=20.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (24.1)\n",
      "Requirement already satisfied: pillow>=6.2.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (10.4.0)\n",
      "Requirement already satisfied: pyparsing<3.1,>=2.3.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (3.0.9)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (2.9.0.post0)\n",
      "Requirement already satisfied: importlib-resources>=3.2.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (6.4.0)\n",
      "Requirement already satisfied: pytz>=2020.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from pandas->BaseML) (2024.1)\n",
      "Requirement already satisfied: tzdata>=2022.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from pandas->BaseML) (2023.3)\n",
      "Requirement already satisfied: scipy>=1.8 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (1.10.1)\n",
      "Requirement already satisfied: networkx>=2.8 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (3.1)\n",
      "Requirement already satisfied: imageio>=2.27 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (2.35.1)\n",
      "Requirement already satisfied: tifffile>=2022.8.12 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (2023.7.10)\n",
      "Requirement already satisfied: PyWavelets>=1.1.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (1.4.1)\n",
      "Requirement already satisfied: lazy_loader>=0.2 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (0.4)\n",
      "Requirement already satisfied: joblib>=1.1.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-learn->BaseML) (1.4.2)\n",
      "Requirement already satisfied: threadpoolctl>=2.0.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-learn->BaseML) (3.5.0)\n",
      "Requirement already satisfied: zipp>=3.1.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from importlib-resources>=3.2.0->matplotlib->BaseML) (3.17.0)\n",
      "Requirement already satisfied: six>=1.5 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib->BaseML) (1.16.0)\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "# 更新库文件\n",
    "%pip install --upgrade BaseML\n",
    "# 导入库文件，选择回归模块\n",
    "from BaseML import Regression as reg\n",
    "# 构建线性回归模型\n",
    "model = reg(algorithm = 'LinearRegression')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 步骤3：训练模型\n",
    "\n",
    "将数据集载入模型，进行模型训练，并将模型保存至指定路径。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving model checkpoints...\n",
      "Saved successfully!\n"
     ]
    }
   ],
   "source": [
    "# 从data/model_train.csv路径载入数据集\n",
    "model.load_tab_data('data/model_train.csv')\n",
    "# 训练模型\n",
    "model.train()\n",
    "# 将模型保存至checkpoints/BaseML_1.pkl\n",
    "model.save('checkpoints/BaseML_1.pkl')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 步骤4：验证模型\n",
    "\n",
    "模型训练完成，但是该模型效果如何？R的平方值可以评价回归模型的准确度。因此，我们可以根据以下的代码进行模型验证。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "验证r2-score为：100.0%\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x550 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.load('checkpoints/BaseML_1.pkl')\n",
    "# 读取验证集进行验证并计算R平方值\n",
    "r2,result = model.valid('data/model_evaluation.csv', metrics='r2') # 载入验证数据\n",
    "model.metricplot() # 可视化验证效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    }
   ],
   "source": [
    "# 输出评估指标计算结果\n",
    "print(r2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 30.2  33.8  37.4  41.   44.6  59.   62.6  69.8  98.6 113. ]\n"
     ]
    }
   ],
   "source": [
    "# 输出每条数据的模型推断值\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. 步骤5：应用模型\n",
    "\n",
    "模型验证后我们就可以应用模型啦。输入摄氏温度，测试输出的华氏温度是否正确。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4.2.2 实验二：输入华氏温度输出摄氏温度\n",
    "\n",
    "通过实验一，我们已经实现了“输入摄氏温度，输出为华氏温度”的功能。但是如果要训练输入“华氏温度，输出为摄氏温度”的模型，我们又该如何实现呢？（提示：数据集需要做什么修改？）请以小组为单位，参考资源包中的代码完成模型训练，实现功能：“输入华氏温度，输出为摄氏温度”。\n",
    "\n",
    "1. 步骤1：数据准备\n",
    "\n",
    "创建一个新的训练数据集model_train_2.csv，将原训练数据集（data/model_train.csv）的输入和输出列互换，粘贴至新数据集并上传至data文件中。同理，创建新的评估数据集data/model_evaluation_2.csv。\n",
    "\n",
    "2. 步骤2：加载模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: BaseML in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (0.1.5)\n",
      "Requirement already satisfied: scikit-learn in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (1.3.2)\n",
      "Requirement already satisfied: pandas in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (2.0.3)\n",
      "Requirement already satisfied: numpy in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (1.24.3)\n",
      "Requirement already satisfied: seaborn in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (0.13.2)\n",
      "Requirement already satisfied: scikit-image in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (0.21.0)\n",
      "Requirement already satisfied: matplotlib in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (3.7.2)\n",
      "Requirement already satisfied: opencv-python>=4.1.2.30 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (4.10.0.84)\n",
      "Requirement already satisfied: yellowbrick in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from BaseML) (1.5)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (1.0.5)\n",
      "Requirement already satisfied: cycler>=0.10 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (0.11.0)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (4.51.0)\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (1.4.4)\n",
      "Requirement already satisfied: packaging>=20.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (24.1)\n",
      "Requirement already satisfied: pillow>=6.2.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (10.4.0)\n",
      "Requirement already satisfied: pyparsing<3.1,>=2.3.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (3.0.9)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (2.9.0.post0)\n",
      "Requirement already satisfied: importlib-resources>=3.2.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from matplotlib->BaseML) (6.4.0)\n",
      "Requirement already satisfied: pytz>=2020.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from pandas->BaseML) (2024.1)\n",
      "Requirement already satisfied: tzdata>=2022.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from pandas->BaseML) (2023.3)\n",
      "Requirement already satisfied: scipy>=1.8 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (1.10.1)\n",
      "Requirement already satisfied: networkx>=2.8 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (3.1)\n",
      "Requirement already satisfied: imageio>=2.27 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (2.35.1)\n",
      "Requirement already satisfied: tifffile>=2022.8.12 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (2023.7.10)\n",
      "Requirement already satisfied: PyWavelets>=1.1.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (1.4.1)\n",
      "Requirement already satisfied: lazy_loader>=0.2 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-image->BaseML) (0.4)\n",
      "Requirement already satisfied: joblib>=1.1.1 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-learn->BaseML) (1.4.2)\n",
      "Requirement already satisfied: threadpoolctl>=2.0.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from scikit-learn->BaseML) (3.5.0)\n",
      "Requirement already satisfied: zipp>=3.1.0 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from importlib-resources>=3.2.0->matplotlib->BaseML) (3.17.0)\n",
      "Requirement already satisfied: six>=1.5 in /Users/kevinzhang/miniconda3/envs/dev/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib->BaseML) (1.16.0)\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(array([[  5. ],\n",
       "        [ 14. ],\n",
       "        [ 21.2],\n",
       "        [ 26.6],\n",
       "        [ 28.4],\n",
       "        [ 32. ],\n",
       "        [ 35.6],\n",
       "        [ 39.2],\n",
       "        [ 42.8],\n",
       "        [ 48.2],\n",
       "        [ 50. ],\n",
       "        [ 51.8],\n",
       "        [ 53.6],\n",
       "        [ 55.4],\n",
       "        [ 60.8],\n",
       "        [ 64.4],\n",
       "        [ 66.2],\n",
       "        [ 68. ],\n",
       "        [ 71.6],\n",
       "        [ 77. ],\n",
       "        [ 78.8],\n",
       "        [ 82.4],\n",
       "        [ 86. ],\n",
       "        [ 87.8],\n",
       "        [ 96.8],\n",
       "        [111.2],\n",
       "        [134.6]]),\n",
       " array([-15., -10.,  -6.,  -3.,  -2.,   0.,   2.,   4.,   6.,   9.,  10.,\n",
       "         11.,  12.,  13.,  16.,  18.,  19.,  20.,  22.,  25.,  26.,  28.,\n",
       "         30.,  31.,  36.,  44.,  57.]),\n",
       " None,\n",
       " None)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 更新库文件\n",
    "%pip install --upgrade BaseML\n",
    "# 导入库文件，选择回归模块\n",
    "from BaseML import Regression as reg\n",
    "# 构建线性回归模型\n",
    "model = reg(algorithm = 'LinearRegression')\n",
    "# 从data/model_train_2.csv路径载入数据集\n",
    "model.load_tab_data('data/model_train_2.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 步骤3：训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving model checkpoints...\n",
      "Saved successfully!\n"
     ]
    }
   ],
   "source": [
    "# 训练模型\n",
    "model.train()\n",
    "# 将模型保存至checkpoints/BaseML_2.pkl\n",
    "model.save('checkpoints/BaseML_2.pkl')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 步骤4：验证模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "验证r2-score为：100.0%\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x550 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.load('checkpoints/BaseML_2.pkl')\n",
    "# 读取验证集进行验证并计算R平方值\n",
    "r2,result = model.valid('data/model_evaluation_2.csv', metrics='r2') # 载入验证数据\n",
    "model.metricplot() # 可视化验证效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    }
   ],
   "source": [
    "# 输出评估指标计算结果\n",
    "print(r2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-1.  1.  3.  5.  7. 15. 17. 21. 37. 45.]\n"
     ]
    }
   ],
   "source": [
    "# 输出每条数据的模型推断值\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5. 步骤5：应用模型\n",
    "\n",
    "模型验证后我们就可以应用模型,输入华氏温度，测试输出的摄氏温度是否正确。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "该华氏温度经模型转换得到的摄氏温度为： -3.888888888888898\n"
     ]
    }
   ],
   "source": [
    "# 执行前替换你需要输入的温度值(25)\n",
    "data = float('25')\n",
    "y = model.inference([data])\n",
    "print('该华氏温度经模型转换得到的摄氏温度为：', y[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.实验结论与拓展\n",
    "\n",
    "### 5.1 实验结论\n",
    "\n",
    "- 结论之一\n",
    "  - 通过本次实验，我们成功地构建了一个线性回归模型，用于预测摄氏温度和华氏温度之间的关系。同时，通过R平方值指标对模型的推理能力进行了评估，结果显示模型具有较高的预测准确性。\n",
    "- 结论之二\n",
    "  - 机器学习算法能够从数据中自动寻找规律，这个训练模型的过程叫做学习。\n",
    "\n",
    "### 5.2 实验拓展\n",
    "\n",
    "“线性回归”是一个常见的数据分析方法，在很多数据分析软件能找到。请用Excel中的图表中“趋势线分析”功能研究这一温度转换数据集，并体会R平方值的作用。\n",
    "\n",
    "## 7.知识链接（补充的相关知识）\n",
    "### 7.1 “回归”一词的来源\n",
    "\n",
    "“回归”（Regression）这个词汇在统计学中的使用起源于19世纪的一位英国科学家兼统计学家弗朗西斯·高尔顿（Francis Galton）。高尔顿在研究人类身高遗传问题时，观察到父母的身高与子女的身高之间的关系。他发现，如果父母的身高偏离平均值，他们的子女的身高往往会向平均值靠拢，这种现象后来被称为“回归到平均值”。高尔顿在1886年发表的一篇论文中首次使用了“回归”这个词，他用它来描述这种趋势，即异常值的后代往往会有向群体平均值靠拢的倾向。这个词来源于拉丁语“regressus”，意为“后退”。在高尔顿的语境中，它指的是量度的值向后退回到平均水平的趋势。后来，“回归”这一概念在统计学中被进一步发展，形成了回归分析这一重要的统计方法，用于估计和预测变量之间的关系。\n",
    "\n",
    "## 7.2 常用的模型评估指标\n",
    "\n",
    "在回归任务中，除了R平方值之外，还有几种常用的评估指标来衡量模型的性能：\n",
    "  - 均方误差（Mean Squared Error, MSE）：计算所有预测值与实际值之差的平方的平均值。MSE越小，表示模型的预测值与真实值越接近。\n",
    "  - 均方根误差（Root Mean Squared Error, RMSE）：MSE的平方根，与原始数据具有相同的单位，更容易解释。\n",
    "  - 均绝对误差（Mean Absolute Error, MAE）：计算所有预测值与实际值之差的绝对值的平均值。MAE对异常值的敏感度较低。\n",
    "  - 平均绝对百分比误差（Mean Absolute Percentage Error, MAPE）：预测误差的绝对值与实际值的比例的平均值，通常以百分比表示。\n",
    "  - 决定系数（Adjusted R-squared）：R平方值的调整版本，考虑了模型中变量的数量，适用于包含多个自变量的模型。\n",
    "  - F统计量（F-statistic）：用于测试模型中自变量对因变量的联合影响，检验模型的总体有效性。\n",
    "  - 残差图（Residual Plots）：通过绘制实际值与预测值之间的残差，可以检查模型是否违反了线性回归的假设。\n",
    "这些指标从不同的角度评估模型的性能，通常结合使用多个指标来全面评价模型的准确性和可靠性。在实际应用中，选择哪个指标取决于具体的数据特性和业务需求。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
